/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package DAO;
import java.sql.*;
import Fachada.Fachada;
import LogicaNegocio.*;
import java.util.*;

/**
 * 
 * @author GEMA
 */
public class DAOEmpleado
{
    Fachada fachada;
    String reporte = "";

    public DAOEmpleado()
    {
        fachada = new Fachada();
    }

    public int guardarEmpleado(Empleado empleado)
    {
        String sql_guardar;
        sql_guardar="INSERT INTO Empleado(cc_empleado, nombre_empleado, departamento_empleado, id_jefe) VALUES" +
                "('"+ empleado.getCcEmpleado()+"','"+empleado.getNombreEmpleado()+"','"+
                empleado.getDepartamento().getNombreDepartamento()+"','"+empleado.getId_jefe()+"'"+")";

        try
        {
            Connection conexion= fachada.ConexionBaseDatos();
            Statement sentencia=conexion.createStatement();
            int numFilas= sentencia.executeUpdate(sql_guardar);
            conexion.close();
            return numFilas;
        }
        catch(SQLException e)
        {
            System.out.println(e);
        }
        catch(Exception e)
        { System.out.println(e);
        }
        return -1;
    }

    public int eliminarEmpleado(String ccEmpleado)
    {
        String sql_eliminar;
        sql_eliminar="DELETE FROM Empleado WHERE cc_empleado="+"'"+ccEmpleado+"'";

        try
        {
            Connection conexion= fachada.ConexionBaseDatos();
            Statement sentencia=conexion.createStatement();
            int numFilas= sentencia.executeUpdate(sql_eliminar);
            conexion.close();
            return numFilas;
        }
        catch(SQLException e)
        {
            System.out.println(e);
        }
        catch(Exception e)
        { System.out.println(e);
        }
        return -1;

    }

    public String retornarIdJefeSc()
    {
        String IdJefe="";
        String sql_seleccionar;
        sql_seleccionar ="SELECT cc_empleado " +
                "FROM Empleado " +
                "where cc_empleado=id_jefe AND departamento_empleado='Servicio al Cliente'";

        try{
            Connection conexion= fachada.ConexionBaseDatos();
            Statement sentencia = conexion.createStatement();
            ResultSet tabla = sentencia.executeQuery(sql_seleccionar);

            while(tabla.next())
            {
               IdJefe=tabla.getString(1);
            }
            conexion.close();
            System.out.println("Conexion cerrada");
            return IdJefe;
        }
         catch(SQLException e)
         {
             System.out.println(e);
             return null;
         }
         catch(Exception e){
             System.out.println(e);
             return null;
         }
    }

    public String retornarIdJefeVentas()
    {
        String IdJefe="";
        String sql_seleccionar;
        sql_seleccionar ="SELECT cc_empleado " +
                "FROM Empleado " +
                "where cc_empleado=id_jefe AND departamento_empleado='Ventas'";

        try{
            Connection conexion= fachada.ConexionBaseDatos();
            Statement sentencia = conexion.createStatement();
            ResultSet tabla = sentencia.executeQuery(sql_seleccionar);

            while(tabla.next())
            {
               IdJefe=tabla.getString(1);
            }
            conexion.close();
            System.out.println("Conexion cerrada");
            return IdJefe;
        }
         catch(SQLException e)
         {
             System.out.println(e);
             return null;
         }
         catch(Exception e){
             System.out.println(e);
             return null;
         }
    }

    

    public Vector<JefeDeArea> consultarJefes() {
        String sql_seleccionar;
        sql_seleccionar = "SELECT cc_empleado, nombre_empleado, departamento_empleado, id_jefe FROM Empleado WHERE cc_empleado = id_jefe";

        Vector<JefeDeArea> jefes = new Vector<JefeDeArea>();

        try{
            Connection conexion= fachada.ConexionBaseDatos();
            Statement sentencia = conexion.createStatement();
            ResultSet tabla = sentencia.executeQuery(sql_seleccionar);
            
            while(tabla.next())
            {
               JefeDeArea elJefe = new JefeDeArea(tabla.getString("cc_empleado"),
                                                  tabla.getString("nombre_empleado"),
                                                  new Departamento(tabla.getString("departamento_empleado")),
                                                  tabla.getString("id_jefe"));
               jefes.addElement(elJefe);
            }
            conexion.close();
            System.out.println("Conexion cerrada");
            return jefes;
        }
         catch(SQLException e)
         {
             System.out.println(e);
             return null;
         }
         catch(Exception e){
             System.out.println(e);
             return null;
         }
    }

    public int modificarJefe(JefeDeArea jefe)
    {
        String sql_update;
        sql_update = "UPDATE Empleado " +
                     "SET nombre_empleado = '" + jefe.getNombreEmpleado() + "'" +
                     ", departamento_empleado = '" + jefe.getDepartamento().getNombreDepartamento() + "' " +
                     "WHERE cc_empleado = '" + jefe.getCcEmpleado() +"'";
        try
        {
            Connection conexion= fachada.ConexionBaseDatos();
            Statement sentencia=conexion.createStatement();
            int numFilas= sentencia.executeUpdate(sql_update);
            conexion.close();
            return numFilas;
        }
        catch(SQLException e)
        {
            System.out.println(e);
        }
        catch(Exception e)
        { System.out.println(e);
        }
        return -1;
    }

    public int modificarContraseNa(String cedula, String password)
    {
        String sql_update;
        sql_update = "UPDATE password = '" + password + "' FROM Login" +
                     "WHERE cc_empleado = '" + cedula +"'";
        try
        {
            Connection conexion= fachada.ConexionBaseDatos();
            Statement sentencia=conexion.createStatement();
            int numFilas= sentencia.executeUpdate(sql_update);
            conexion.close();
            return numFilas;
        }
        catch(SQLException e)
        {
            System.out.println(e);
        }
        catch(Exception e)
        { System.out.println(e);
        }
        return -1;
    }

    public int actualizarIdJefe(String cedulaNuevoJefe, String nombre, String departamento) throws SQLException, Exception {
        String sql_update;
        sql_update = "UPDATE Empleado " +
                     "SET id_jefe = '" + cedulaNuevoJefe + "', " +
                     "nombre_empleado = '" + nombre + "', " +
                     "departamento_empleado = '" + departamento +"' " +
                     "WHERE cc_empleado = '" + cedulaNuevoJefe +"'";
        Connection conexion= fachada.ConexionBaseDatos();
        Statement sentencia=conexion.createStatement();
        int numFilas= sentencia.executeUpdate(sql_update);
        conexion.close();
        return numFilas;
    }

    public int actualizarJefeDeEmpleados(String cedulaJefeAntiguo, String cedulaNuevoJefe) throws SQLException, Exception  {
        String sql_update;
        sql_update = "UPDATE Empleado " +
                     "SET id_jefe = '" + cedulaNuevoJefe + "' " +
                     "WHERE id_jefe = '" + cedulaJefeAntiguo +"'";
        Connection conexion= fachada.ConexionBaseDatos();
        Statement sentencia=conexion.createStatement();
        int numFilas= sentencia.executeUpdate(sql_update);
        conexion.close();
        return numFilas;
    }

    public int cambiarJefe(String cedulaJefeAntiguo, Empleado nuevoJefe) {
        try {
            int numFilas = actualizarIdJefe(nuevoJefe.getCcEmpleado(),
                                            nuevoJefe.getNombreEmpleado(),
                                            nuevoJefe.getDepartamento().getNombreDepartamento());
            numFilas = actualizarJefeDeEmpleados(cedulaJefeAntiguo,
                                                 nuevoJefe.getCcEmpleado());
            return numFilas;
        }
        catch(SQLException e)
        {
            System.out.println(e);
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
        return -1;
    }

    public Vector<Empleado> consultarRSC()
    {
        String sql_seleccionar;
        sql_seleccionar = "SELECT cc_empleado, nombre_empleado, departamento_empleado, id_jefe " +
                          "FROM Empleado " +
                          "WHERE cc_empleado <> id_jefe AND departamento_empleado = 'Servicio al Cliente'";

        Vector<Empleado> vectorRSC = new Vector<Empleado>();

        try{
            Connection conexion= fachada.ConexionBaseDatos();
            Statement sentencia = conexion.createStatement();
            ResultSet tabla = sentencia.executeQuery(sql_seleccionar);

            while(tabla.next())
            {
               Empleado empleado = new Empleado(tabla.getString("cc_empleado"),
                                                  tabla.getString("nombre_empleado"),
                                                  new Departamento(tabla.getString("departamento_empleado")),
                                                  tabla.getString("id_jefe"));
               vectorRSC.addElement(empleado);
            }
            conexion.close();
            System.out.println("Conexion cerrada");
            return vectorRSC;
        }
         catch(SQLException e)
         {
             System.out.println(e);
             return null;
         }
         catch(Exception e){
             System.out.println(e);
             return null;
         }
    }

    public Vector<Empleado> consultarRrepresentanteVentas()
    {
        String sql_seleccionar;
        sql_seleccionar = "SELECT cc_empleado, nombre_empleado, departamento_empleado, id_jefe " +
                          "FROM Empleado " +
                          "WHERE cc_empleado <> id_jefe AND departamento_empleado = 'Ventas'";

        Vector<Empleado> vectorRepresentanteVentas = new Vector<Empleado>();

        try{
            Connection conexion= fachada.ConexionBaseDatos();
            Statement sentencia = conexion.createStatement();
            ResultSet tabla = sentencia.executeQuery(sql_seleccionar);

            while(tabla.next())
            {
               Empleado empleado = new Empleado(tabla.getString("cc_empleado"),
                                                  tabla.getString("nombre_empleado"),
                                                  new Departamento(tabla.getString("departamento_empleado")),
                                                  tabla.getString("id_jefe"));
               vectorRepresentanteVentas.addElement(empleado);
            }
            conexion.close();
            System.out.println("Conexion cerrada");
            return vectorRepresentanteVentas;
        }
         catch(SQLException e)
         {
             System.out.println(e);
             return null;
         }
         catch(Exception e){
             System.out.println(e);
             return null;
         }
    }

    public int modificarNombreEmpleado(Empleado empleado)
    {
        String sql_modificar;
        sql_modificar = "UPDATE Empleado "+
                        "SET  nombre_empleado = '" + empleado.getNombreEmpleado() + "' " +
                        "WHERE cc_empleado = '" + empleado.getCcEmpleado() + "'";

        try
        {
            Connection conn = fachada.ConexionBaseDatos();
            Statement sentencia = conn.createStatement();
            int numFilas = sentencia.executeUpdate(sql_modificar);
            conn.close();
            return numFilas;
        }
        catch(SQLException e){System.out.println(e); }
        catch(Exception e){System.out.println(e); }
        return -1;
    }

    public int modificarDepartamentoEmpleado(Empleado empleado)
    {
        String sql_modificar;
        sql_modificar = "UPDATE Empleado "+
                        "SET  departamento_empleado = '" + empleado.getDepartamento().getNombreDepartamento() + "' " +
                        "WHERE cc_empleado = '" + empleado.getCcEmpleado() + "'";

        try
        {
            Connection conn = fachada.ConexionBaseDatos();
            Statement sentencia = conn.createStatement();
            int numFilas = sentencia.executeUpdate(sql_modificar);
            conn.close();
            return numFilas;
        }
        catch(SQLException e){System.out.println(e); }
        catch(Exception e){System.out.println(e); }
        return -1;
    }

    public int modificarJefeEmpleado(Empleado empleado)
    {
        String sql_modificar;
        sql_modificar = "UPDATE Empleado "+
                        "SET  id_jefe = '" + empleado.getId_jefe() + "' " +
                        "WHERE cc_empleado = '" + empleado.getCcEmpleado() + "'";

        try
        {
            Connection conn = fachada.ConexionBaseDatos();
            Statement sentencia = conn.createStatement();
            int numFilas = sentencia.executeUpdate(sql_modificar);
            conn.close();
            return numFilas;
        }
        catch(SQLException e){System.out.println(e); }
        catch(Exception e){System.out.println(e); }
        return -1;
    }

    public Empleado consultarEmpleado(String codigo) {
        String sql_seleccionar;
        sql_seleccionar = "SELECT * FROM Empleado WHERE cc_empleado = '" + codigo + "'";

        try{
            Connection conexion= fachada.ConexionBaseDatos();
            Statement sentencia = conexion.createStatement();
            ResultSet tabla = sentencia.executeQuery(sql_seleccionar);

            Empleado empleado = null;

            while(tabla.next())
            {
               empleado = new Empleado(tabla.getString("cc_empleado"),
                                       tabla.getString("nombre_empleado"),
                                       new Departamento(tabla.getString("departamento_empleado")),
                                       tabla.getString("id_jefe"));
            }
            conexion.close();
            System.out.println("Conexion cerrada");
            return empleado;
        }
         catch(SQLException e)
         {
             System.out.println(e);
             return null;
         }
         catch(Exception e){
             System.out.println(e);
             return null;
         }
    }

        public Vector <Vector> nombresRSC()
    {
        String sql_select;
        sql_select = "SELECT cc_empleado, nombre_empleado " +
                     "FROM Empleado " +
                     "WHERE departamento_empleado = 'Servicio al Cliente' AND id_jefe <> cc_empleado";
        Vector <Vector> vectorCSC = new Vector <Vector>();

        try
        {
            Connection conn = fachada.ConexionBaseDatos();
            Statement sentencia = conn.createStatement();
            ResultSet tabla = sentencia.executeQuery(sql_select);

            while(tabla.next())
            {
                Vector <String> descripcion = new Vector <String>();
                descripcion.addElement(tabla.getString(1));
                descripcion.addElement(tabla.getString(2));

                vectorCSC.addElement(descripcion);
            }
            conn.close();
            System.out.println("Conexion cerrada");
            return vectorCSC;
        }
        catch(SQLException e)
        {
            System.out.println(e);
            return null;
        }
        catch(Exception e)
        {
            System.out.println(e);
            return null;
        }
    }

    public Vector<Vector> reporteRSC()
    {
        String sql_select;
        sql_select = "SELECT cc_empleado, nombre_empleado, COUNT(*) AS CantidadCasos, AVG(Duracion) AS Promedio " +
                     "FROM (SELECT cc_empleado, nombre_empleado, fecha_finalizacion_csc - fecha_inicio_csc AS Duracion "+
                           "FROM Empleado NATURAL JOIN CasoServicioCliente) "+
                           "GROUP BY cc_empleado, nombre_empleado";

        Vector <Vector> vectorCSC = new Vector <Vector>();
        reporte = sql_select;

        try
        {
            Connection conn = fachada.ConexionBaseDatos();
            Statement sentencia = conn.createStatement();
            ResultSet tabla = sentencia.executeQuery(sql_select);

            while(tabla.next())
            {
                Vector <String> descripcion = new Vector <String>();
                descripcion.addElement(tabla.getString(1));
                descripcion.addElement(tabla.getString(2));
                descripcion.addElement(tabla.getString(3));
                descripcion.addElement(tabla.getString(4));
                vectorCSC.addElement(descripcion);
            }
            conn.close();
            System.out.println("Conexion cerrada");
            return vectorCSC;
        }
        catch(SQLException e)
        {
            System.out.println(e);
            return null;
        }
        catch(Exception e)
        {
            System.out.println(e);
            return null;
        }
    }

    public Vector<Vector> maximoRSC()
    {
        String sql_select;
        sql_select = "SELECT MAX(Promedio) FROM ("+reporte+")";

        System.out.println(sql_select);

        Vector <Vector> vectorCSC = new Vector <Vector>();

        try
        {
            Connection conn = fachada.ConexionBaseDatos();
            Statement sentencia = conn.createStatement();
            ResultSet tabla = sentencia.executeQuery(sql_select);

            while(tabla.next())
            {
                Vector <String> descripcion = new Vector <String>();
                descripcion.addElement(tabla.getString(1));
                vectorCSC.addElement(descripcion);
            }
            conn.close();
            System.out.println("Conexion cerrada");
            return vectorCSC;
        }
        catch(SQLException e)
        {
            System.out.println(e);
            return null;
        }
        catch(Exception e)
        {
            System.out.println(e);
            return null;
        }
    }

     public Vector<Vector> minimoRSC()
    {
        String sql_select;
        sql_select = "SELECT MIN(Promedio) FROM ("+reporte+")";

        Vector <Vector> vectorCSC = new Vector <Vector>();
        reporte = sql_select;

        try
        {
            Connection conn = fachada.ConexionBaseDatos();
            Statement sentencia = conn.createStatement();
            ResultSet tabla = sentencia.executeQuery(sql_select);

            while(tabla.next())
            {
                Vector <String> descripcion = new Vector <String>();
                descripcion.addElement(tabla.getString(1));
                vectorCSC.addElement(descripcion);
            }
            conn.close();
            System.out.println("Conexion cerrada");
            return vectorCSC;
        }
        catch(SQLException e)
        {
            System.out.println(e);
            return null;
        }
        catch(Exception e)
        {
            System.out.println(e);
            return null;
        }
    }
}
